﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using PhoneAppSTS.StsService;
using System.Diagnostics;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using STS.Model;

namespace PhoneAppSTS.Utils
{
    public class SurveyUtils : INotifyPropertyChanged
    {
        private ObservableCollection<badania> listaBadaniaOgolne;
        public ObservableCollection<badania> ListaBadaniaOgolne
        {
            get
            {
                return listaBadaniaOgolne;
            }
            set
            {
                listaBadaniaOgolne = value;
                OnPropertyChanged("ListaBadaniaOgolne");
            }
        }

        private badania badaniaOgolne;
        public badania BadaniaOgolne
        {
            get
            {
                if (badaniaOgolne == null)
                {
                    badaniaOgolne = new badania();
                }
                return badaniaOgolne;
            }
            set
            {
                badaniaOgolne = value;
                OnPropertyChanged("BadaniaOgolne");
            }
        }

        private ObservableCollection<badania_mocz> listaBadaniaMoczu;
        public ObservableCollection<badania_mocz> ListaBadaniaMoczu
        {
            get
            {
                return listaBadaniaMoczu;
            }
            set
            {
                listaBadaniaMoczu = value;
                OnPropertyChanged("ListaBadaniaMoczu");
            }
        }

        private badania_mocz badaniaMoczu;
        public badania_mocz BadaniaMoczu
        {
            get
            {
                if (badaniaMoczu == null)
                {
                    badaniaMoczu = new badania_mocz();
                }
                return badaniaMoczu;
            }
            set
            {
                badaniaMoczu = value;
                OnPropertyChanged("BadaniaMoczu");
            }
        }

        private ObservableCollection<badania_krew> listaBadaniaKrwi;
        public ObservableCollection<badania_krew> ListaBadaniaKrwi
        {
            get
            {
                return listaBadaniaKrwi;
            }
            set
            {
                listaBadaniaKrwi = value;
                OnPropertyChanged("ListaBadaniaKrwi");
            }
        }

        private badania_krew badaniaKrwi;
        public badania_krew BadaniaKrwi
        {
            get
            {
                if (badaniaKrwi == null)
                {
                    badaniaKrwi = new badania_krew();
                }
                return badaniaKrwi;
            }
            set
            {
                badaniaKrwi = value;
                OnPropertyChanged("BadaniaKrwi");
            }
        }

        private string lekarz;
        public string Lekarz
        {
            get
            {
                return lekarz;
            }
            set
            {
                lekarz = value;
                OnPropertyChanged("Lekarz");
            }
        }

        private string lekarzMocz;
        public string LekarzMocz
        {
            get
            {
                return lekarzMocz;
            }
            set
            {
                lekarzMocz = value;
                OnPropertyChanged("LekarzMocz");
            }
        }

        private string lekarzKrew;
        public string LekarzKrew
        {
            get
            {
                return lekarzKrew;
            }
            set
            {
                lekarzKrew = value;
                OnPropertyChanged("LekarzKrew");
            }
        }

        public void DownloadBadaniaKrwi(int id_pacjenta)
        {
            Service1Client badaniaKrwi = new Service1Client();
            badaniaKrwi.GetBadaniaKrwiCompleted += new EventHandler<GetBadaniaKrwiCompletedEventArgs>(badaniaKrwi_GetBadaniaKrwiCompleted);
            badaniaKrwi.GetBadaniaKrwiAsync(id_pacjenta);
        }

        public void DownloadBadaniaMoczu(int id_pacjenta)
        {
            Service1Client badaniaMoczu = new Service1Client();
            badaniaMoczu.GetBadaniaMoczuCompleted += new EventHandler<GetBadaniaMoczuCompletedEventArgs>(badaniaMoczu_GetBadaniaMoczuCompleted);
            badaniaMoczu.GetBadaniaMoczuAsync(id_pacjenta);
        }

        void badaniaMoczu_GetBadaniaMoczuCompleted(object sender, GetBadaniaMoczuCompletedEventArgs e)
        {
            try
            {
                ListaBadaniaMoczu = e.Result;
                foreach (var item in ListaBadaniaMoczu)
                {
                    BadaniaMoczu = item;
                    break;
                }
                LekarzMocz = BadaniaMoczu.dane_lekarzy.Imie + " " + BadaniaMoczu.dane_lekarzy.Nazwisko;

                //dodanie do bazy
                ModelInstance.BadaniaMoczViewModel.AddBadaniaMocz(ConvertToBadaniaMoczu(BadaniaMoczu));
                ModelInstance.DaneLekarzyViewModel.AddDaneLekarzy(ConvertToDaneLekarzy(BadaniaMoczu.dane_lekarzy));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        private BadaniaMocz ConvertToBadaniaMoczu(badania_mocz badaniaMoczu)
        {
            BadaniaMocz bm = new BadaniaMocz();
            bm.Azotyny = badaniaMoczu.azotyny;
            bm.Barwa = badaniaMoczu.barwa;
            bm.Bialko = badaniaMoczu.bialko;
            bm.Bilirubina = badaniaMoczu.bilirubina;
            bm.CialaKetonowe = badaniaMoczu.ciala_ketonowe;
            bm.CiezarWl = (double)badaniaMoczu.ciezar_wl;
            bm.DataBadania = (DateTime)badaniaMoczu.data_badania;
            bm.Glukoza = badaniaMoczu.glukoza;
            bm.IdLekarza = (int)badaniaMoczu.id_lekarza;
            bm.IdMocz = badaniaMoczu.id_mocz;
            bm.IdPacjenta = (int)badaniaMoczu.id_pacjenta;
            bm.Leukocyty = (double)badaniaMoczu.leukocyty;
            bm.NablonkiPlaskie = badaniaMoczu.nablonki_plaskie;
            bm.PasmaSlizu = badaniaMoczu.pasma_slizu;
            bm.Ph = (double)badaniaMoczu.ph;
            bm.Przejrzystosc = badaniaMoczu.przejrzystosc;
            bm.Urobilinogen = badaniaMoczu.urobilinogen;
            return bm;
        }

        void badaniaKrwi_GetBadaniaKrwiCompleted(object sender, GetBadaniaKrwiCompletedEventArgs e)
        {
            try
            {
                ListaBadaniaKrwi = e.Result;
                foreach (var item in ListaBadaniaKrwi)
                {
                    BadaniaKrwi = item;
                    break;
                }
                LekarzKrew = BadaniaKrwi.dane_lekarzy.Imie + " " + BadaniaKrwi.dane_lekarzy.Nazwisko;

                //dodanie do bazy
                ModelInstance.BadaniaKrewViewModel.AddBadaniaKrew(ConvertToBadaniaKrwi(BadaniaKrwi));
                ModelInstance.DaneLekarzyViewModel.AddDaneLekarzy(ConvertToDaneLekarzy(BadaniaKrwi.dane_lekarzy));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        private DaneLekarzy ConvertToDaneLekarzy(dane_lekarzy dane_lekarzy)
        {
            DaneLekarzy dk = new DaneLekarzy();
            dk.IdLekarza = dane_lekarzy.ID_Pracownika;
            dk.IdOsrodka = (int)dane_lekarzy.id_osrodka;
            dk.Imie = dane_lekarzy.Imie;
            dk.Nazwisko = dane_lekarzy.Nazwisko;
            dk.DataUrodzenia = (DateTime)dane_lekarzy.Data_Urodzenia;
            return dk;
        }

        private BadaniaKrew ConvertToBadaniaKrwi(badania_krew badaniaKrwi)
        {
            BadaniaKrew bk = new BadaniaKrew();
            bk.Bazocyty = (double)badaniaKrwi.bazocyty;
            bk.DataBadania = (DateTime)badaniaKrwi.data_badania;
            bk.Eozynocyty = (double)badaniaKrwi.eozynocyty;
            bk.Hematokryt = (double)badaniaKrwi.Hematokryt;
            bk.Hemoglobina = (double)badaniaKrwi.Hemoglobina;
            bk.IdKrew = badaniaKrwi.id_badania;
            bk.IdLekarza = (int)badaniaKrwi.id_lekarza;
            bk.IdPacjenta = (int)badaniaKrwi.id_pacjenta;
            bk.Kreatynina = (double)badaniaKrwi.kreatynina;
            bk.Limfocyty = (double)badaniaKrwi.limfocyty;
            bk.MCH = (double)badaniaKrwi.MCH;
            bk.MCHC = (double)badaniaKrwi.MCHC;
            bk.MCV = (double)badaniaKrwi.MCV;
            bk.Monocyty = (double)badaniaKrwi.monocyty;
            bk.MPV = (double)badaniaKrwi.MPV;
            bk.Neurocyty = (double)badaniaKrwi.neurocyty;
            bk.NRBC = (double)badaniaKrwi.NRBC;
            bk.P_bazocyty = (double)badaniaKrwi.p_bazocyty;
            bk.P_eozynocyty = (double)badaniaKrwi.p_eozynocyty;
            bk.P_LCR = (double)badaniaKrwi.P_LCR;
            bk.P_limfocyty = (double)badaniaKrwi.p_limfocyty;
            bk.P_monocyty = (double)badaniaKrwi.p_monocyty;
            bk.P_neutrocyty = (double)badaniaKrwi.p_neutrocyty;
            bk.PCT = (double)badaniaKrwi.PCT;
            bk.PDW = (double)badaniaKrwi.PDW;
            bk.PlytkiKrwi = (double)badaniaKrwi.Plytki_krwi;
            bk.Potas = (double)badaniaKrwi.potas;
            bk.RBC = (double)badaniaKrwi.RBC;
            bk.RDW_CV = (double)badaniaKrwi.RDW_CV;
            bk.RDW_SD = (double)badaniaKrwi.RDW_SD;
            bk.WBC = (double)badaniaKrwi.WBC;
            return bk;
        }

        public void DownloadBadaniaOgolne(int id_pacjenta)
        {
            Service1Client badaniaOgolne = new Service1Client();
            badaniaOgolne.GetBadaniaOgolneCompleted += new EventHandler<GetBadaniaOgolneCompletedEventArgs>(badaniaOgolne_GetBadaniaOgolneCompleted);
            badaniaOgolne.GetBadaniaOgolneAsync(id_pacjenta);
        }

        void badaniaOgolne_GetBadaniaOgolneCompleted(object sender, GetBadaniaOgolneCompletedEventArgs e)
        {
            try
            {
                ListaBadaniaOgolne = e.Result;
                foreach (var item in ListaBadaniaOgolne)
                {
                    BadaniaOgolne = item;
                    break;
                }
                Lekarz = BadaniaOgolne.dane_lekarzy.Imie + " " + BadaniaOgolne.dane_lekarzy.Nazwisko;

                //dodanie do bazy
                ModelInstance.BadaniaViewModel.AddBadania(ConvertToBadaniaOgolne(BadaniaOgolne));
                ModelInstance.DaneLekarzyViewModel.AddDaneLekarzy(ConvertToDaneLekarzy(BadaniaOgolne.dane_lekarzy));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        private Badania ConvertToBadaniaOgolne(badania badaniaOgolne)
        {
            Badania bd = new Badania();
            bd.DataBadania = (DateTime)badaniaOgolne.data;
            bd.IdBadania = badaniaOgolne.id_badania;
            bd.IdLekarza = (int)badaniaOgolne.id_lekarza;
            bd.IdPacjenta = (int)badaniaOgolne.id_pacjenta;
            bd.NazwaBadania = badaniaOgolne.nazwa_badania;
            bd.OpisBadania = badaniaOgolne.opis_badania;
            return bd;
        }

        private void OnPropertyChanged(string p)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(p));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
